class PresupuestoController < ApplicationController

  def list
    conditions = {}
    conditions[:ejecutivo_id] = session[:user]
    
    @presupuestos = Presupuesto.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :conditions => conditions, :order => 'marca_id, rubro_id'
    
  end

  def new
    @presupuesto = Presupuesto.new
    @id = session[:user]
    
    @marcas = Familia.cuervo
  end

  def index
    list
    
    render :action => "list"
  end
  
  def create
    @presupuesto = Presupuesto.new(params[:presupuesto])
    @presupuesto.ejecutivo_id = session[:user]
    
    if @presupuesto.save
      flash[:notice] = "El Presupuesto se agrego correctamente."
      redirect_to :action => "index", :id => session[:user]
      
    else
      @marcas = Familia.cuervo
      
      render :action => "new"
    end
  end
  
  def personal
    personal = Ejecutivo.find(session[:user])
    @presupuesto_original = Presupuesto.find(params[:id])

    if gerente_op?
      @children = Ejecutivo.personal_cuervo
    elsif gerente?
      @children = personal.siblings.dup
      personal.children.each do |c|
        @children << c.dup
      end
      @children << personal.parent unless personal.reporta_a_id.blank?
      
    else
      @children = personal.children.dup
      @children << personal.parent unless personal.reporta_a_id.blank?
    end
    
  end
  
  def p_asign
    @origen = Presupuesto.find(params[:id])
    importe = params[:asignacion][:importe].to_f

    destino_id = params[:asignacion][:destino]
    @destino = Presupuesto.find(destino_id)
    
    if @destino.nil?
      @destino = Presupuesto.new
      @destino.ejecutivo_id = ejecutivo.id
      @destino.marca_id = @origen.marca_id
      @destino.rubro_id = @origen.rubro_id
      @destino.saldo_inicial = 0.0
    end
    
    if @origen.autorizar(importe)
      if gerente?
        # reservar
        Presupuesto.reservar(@origen, @destino, importe)
      else
        # transferir
        Presupuesto.transferir(@origen, @destino, importe)
      end

      redirect_to :action => "index", :id => session[:user]
    else
      redirect_to :action => "personal", :id => params[:id]
    end
  end
  
  def centro
    ejecutivo = Ejecutivo.find(session[:user])
    @presupuesto = Presupuesto.find(params[:id])

    if gerente_op?
      conditions = {}
      conditions[:status_id] = 1
      @centros = Centro.find(:all, :conditions => conditions, :order => 'nombre_comercial')
    else
      @centros = ejecutivo.centros
    end
  end
  
  def c_asign
    @origen = Presupuesto.find(params[:id])
    importe = params[:asignacion][:importe].to_f
    logger.debug "Presupuesto origen: #{@origen.id}"
    logger.debug "Importe: #{importe}"

    # se requiere encontrar los presupuestos del ejecutivo seleccionado y filtrarlo
    # por la misma marca del presupuesto original
    centro = Centro.find(params[:asignacion][:centro_id])
    logger.debug "Centro: #{centro.nombre_comercial}"
    conditions = {}
    conditions[:centro_id] = centro.id
    conditions[:marca_id] = @origen.marca_id
    conditions[:rubro_id] = @origen.rubro_id
    @destino = Presupuesto.find(:first, :conditions => conditions)
    
    if @destino.nil?
      logger.debug "No existe presupuesto destino."
      @destino = Presupuesto.new
      @destino.centro_id = centro.id
      @destino.marca_id = @origen.marca_id
      @destino.rubro_id = @origen.rubro_id
      @destino.saldo_inicial = 0.0
    end
    
    # crear dos partidas de detalle
    # 1) aplicar un movimiento de cargo al presupuesto origen
    logger.debug "Aplicar movimiento de cargo al presupuesto origen"
    cargo = PresupuestoDetalle.new
    cargo.importe = importe
    cargo.operacion = PresupuestoDetalle::CARGO
    @origen.presupuesto_detalles << cargo    
    
    # 2) aplicar un movimiento de abono al presupuesto destino
    logger.debug "Aplicar movimiento de abono al presupuesto destino"
    abono = PresupuestoDetalle.new
    abono.importe = importe
    abono.operacion = PresupuestoDetalle::ABONO
    @destino.presupuesto_detalles << abono
    
    logger.debug "Guardar presupuestos."
    Presupuesto.transaction do
      @origen.save
      @destino.save
    end
    
    redirect_to :action => "index", :id => session[:user]
  end
  
  def list_all
    @presupuestos = Presupuesto.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :order => 'centro_id, ejecutivo_id, marca_id, rubro_id'
    
  end
  
  def detail
    @presupuesto = Presupuesto.find(params[:id])
    
  end
  
  def extension
    @presupuesto = Presupuesto.find(params[:id])
    
  end
  
  def asignar_extension
    @presupuesto = Presupuesto.find(params[:id])
    importe = params[:asignacion][:importe].to_f
    
    if importe > 0.0
      extension = PresupuestoDetalle.new(
        :importe => importe, :operacion => PresupuestoDetalle::ABONO)
    
      @presupuesto.presupuesto_detalles << extension
    end
    
    if @presupuesto.save
      flash[:notice] = "Extension guardada correctamente..."
      redirect_to :action => "index"
    else
      logger.error "Error al agregar extension de presupuesto: #{@presupuesto}"
      render :action => "extension", :id => @presupuesto
    end
  end

  def empleado_changed
    logger.debug "id = #{params[:id]}"
      
    unless params[:id].blank?
      conditions = {}
      conditions[:ejecutivo_id] = params[:id]
      presupuestos = Presupuesto.find(:all, :conditions => conditions)
      render :partial => 'presupuesto', :locals => {:presupuestos => presupuestos}, :layout => false
    else
      render :text => '&nbsp;', :layout => false
    end
  end
end
